package DAOHibernate;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import java.util.*;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import acceso.EMF;

import DAO.TesinaDAO;

import modelo.PalabraClave;
import modelo.Tesina;

public class TesinaDAOhiberjpa implements TesinaDAO {

	private static EntityManagerFactory emf = Persistence
			.createEntityManagerFactory("base-ttps-final");
	
	

	public void agregarTesis(Tesina tesina) {

		try {
			EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
			EntityTransaction etx = em.getTransaction();
			etx.begin();
			em.persist(tesina);
			em.flush();
			etx.commit();
			em.close();
		} catch (Exception e) {
			e.getMessage();
		}
	}

	public Tesina obtenerTesisporID(Long idTesis) {

		EntityManager em = EMF.getEMF().createEntityManager();
		EntityTransaction etx = em.getTransaction();
		etx.begin();

		Tesina tesisRecuperada = new Tesina();

		@SuppressWarnings("unchecked")
		List<Tesina> tesinas = (List<Tesina>) (em
				.createQuery("from Tesina where id = " + idTesis + ""))
				.getResultList();
		for (Tesina tes : tesinas) {
			tesisRecuperada.setId(tes.getId());
			tesisRecuperada.setAutor(tes.getAutor());
			tesisRecuperada.setCarrera(tes.getCarrera());
			tesisRecuperada.setConcluciones(tes.getConcluciones());
			tesisRecuperada.setDirector(tes.getDirector());
			tesisRecuperada.setFechaPresentacion(tes.getFechaPresentacion());
			tesisRecuperada.setResumen(tes.getResumen());
			tesisRecuperada.setTitulo(tes.getTitulo());
			tesisRecuperada.setTrabajosFuturos(tes.getTrabajosFuturos());
			tesisRecuperada.setTrabajosRealizados(tes.getTrabajosRealizados());
		}
		em.close();
		etx.commit();

		return tesisRecuperada;
	}

	public Collection<Tesina> obtenerUltimasTesinas() {

		EntityManager em = EMF.getEMF().createEntityManager();
		EntityTransaction etx = em.getTransaction();
		etx.begin();
		Collection<Tesina> resultado = new ArrayList<Tesina>();

		@SuppressWarnings("unchecked")
		List<Tesina> tesinas = (List<Tesina>) (em
				.createQuery("FROM Tesina ORDER BY id DESC LIMIT 0 , 10"))
				.getResultList();
		for (Tesina tes : tesinas) {
			Tesina tesisRecuperada = new Tesina();
			tesisRecuperada.setId(tes.getId());
			tesisRecuperada.setAutor(tes.getAutor());
			tesisRecuperada.setCarrera(tes.getCarrera());
			tesisRecuperada.setConcluciones(tes.getConcluciones());
			tesisRecuperada.setDirector(tes.getDirector());
			tesisRecuperada.setFechaPresentacion(tes.getFechaPresentacion());
			tesisRecuperada.setResumen(tes.getResumen());
			tesisRecuperada.setTitulo(tes.getTitulo());
			tesisRecuperada.setTrabajosFuturos(tes.getTrabajosFuturos());
			tesisRecuperada.setTrabajosRealizados(tes.getTrabajosRealizados());
			tesisRecuperada.setVotoPositivos(tes.getVotoPositivos());
			tesisRecuperada.setVotoNegativos(tes.getVotoNegativos());
			resultado.add(tesisRecuperada);
		}
		etx.commit();
		return resultado;
	}

	@Override
	public Tesina buscarTesis(Long idTesis) {
		Tesina tesis = null;
		try {
			EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
			tesis = em.find(Tesina.class, idTesis);

		} catch (Exception e) {
			e.getMessage();
		}
		return tesis;

	}

	@Override
	public void modificarTesina(Tesina tesis) {
		try {
			EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
			EntityTransaction etx = em.getTransaction();
			etx.begin();
			em.merge(tesis);
			em.flush();
			etx.commit();
			em.close();
		} catch (Exception e) {
			e.getMessage();
		}
	}

	public void eliminarTesis(Long idTesis) {
		try {
			EntityManager em = EMF.getEMF().createEntityManager();
			EntityTransaction etx = em.getTransaction();
			etx.begin();
			Query consulta = em.createQuery(
					"DELETE FROM Tesina E where E.id=:id").setParameter("id",
							idTesis);
			consulta.executeUpdate();
			etx.commit();
			em.close();
			} catch (Exception e) {
				e.getMessage();
			}
		
	
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Tesina> listar(int from, int to, String criterio, String orden) {
		List<Tesina> resultado;

		String sord = "desc";
		if (orden != null && !orden.equals(""))
			sord = orden;

		// order by por defecto: nombre desc
		String stringOrderBy = "titulo " + sord;

		if (criterio != null && !criterio.equals(""))
			stringOrderBy = criterio + " " + sord + ", " + stringOrderBy;

		EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
		Query consulta;
		consulta = em.createQuery("select t from Tesina t order by "
				+ stringOrderBy);



		resultado = (List<Tesina>) consulta.getResultList();

		em.close();
		return resultado;
	}

	@Override
	public Integer contar() {
		int resultado;
		EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
		Query consulta = em.createQuery("select t from Tesina t");
		resultado = consulta.getResultList().size();
		em.close();
		return resultado;
	}

	@Override
	public Integer getTesinaCount(List<Tesina> tesinas) {
		return tesinas.size();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Tesina> buscarTesisEQ(String searchField, String searchString) {
		List<Tesina> resultado;
		EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
		String qString = null;
		if (searchField.equals("titulo")) {
			qString = "from Tesina where titulo = :searchString ";
		} else if (searchField.equals("carrera")) {
			qString = "from Tesina where carrera = :searchString ";
		} else if (searchField.equals("autor")) {
			qString = "from Tesina where autor = :searchString ";
		} else {
			qString = "from Tesina where director = :searchString ";
		}

		Query consulta = em.createQuery(qString).setParameter("searchString",
				searchString);

		resultado = (List<Tesina>) consulta.getResultList();

		em.close();
		return resultado;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Tesina> buscarTesisNE(String searchField, String searchString) {
		List<Tesina> resultado;
		EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
		String qString = null;
		if (searchField.equals("titulo")) {
			qString = "from Tesina where titulo like '%" + searchString + "%' ";
		} else if (searchField.equals("carrera")) {
			qString = "from Tesina where carrera like '%" + searchString
					+ "%' ";
		} else if (searchField.equals("autor")) {
			qString = "from Tesina where autor like '%" + searchString + "%' ";
		} else {
			qString = "from Tesina where director like '%" + searchString
					+ "%' ";
		}

		Query consulta = em.createQuery(qString);

		resultado = (List<Tesina>) consulta.getResultList();

		em.close();
		return resultado;
	}

	@Override
	public Tesina obtenerEstaTesis() {
		EntityManager em = EMF.getEMF().createEntityManager();
		EntityTransaction etx = em.getTransaction();
		etx.begin();
		@SuppressWarnings({ "unchecked" })
		List<Tesina> tesinas = (List<Tesina>) (em
				.createQuery("FROM Tesina ORDER BY id DESC")).getResultList();
		return tesinas.get(0);
	}

	@Override
	public List<Tesina> buscarTesisPorPalabraClave(String palabraClave) {
		List<Tesina> totalTesinas;
		List<Tesina> tesinasCoincidentes = new ArrayList<Tesina>();
		EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
		totalTesinas = this.obtenerTodasLasTesis();
		for (Tesina tesina : totalTesinas) {
			Tesina tesinaEncontrada = this.buscarTesinaPorPalabraClave(tesina,
					palabraClave);
			if (tesinaEncontrada != null) {

				tesinasCoincidentes.add(tesinaEncontrada);
			}
		}

		em.close();
		return tesinasCoincidentes;

	}

	private Tesina buscarTesinaPorPalabraClave(Tesina tesina,
			String palabraClave) {

		Set<PalabraClave> palabrasClaves = tesina.getPalabrasClaves();
		if (!(palabrasClaves.isEmpty())) {
			for (PalabraClave pC : palabrasClaves) {
				String palabra = pC.getPalabra();
				if (palabra.equals(palabraClave)) {
					return tesina;
				}
			}
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Tesina> obtenerTodasLasTesis() {

		List<Tesina> resultado;
		EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
		String qString = null;
		qString = "select u from Tesina u";
		Query consulta = em.createQuery(qString);
		resultado = (List<Tesina>) consulta.getResultList();

		return resultado;
	}

	@Override
	public Tesina crearTesis(String titulo, String autor, String director,
			String carrera, String resumen, String concluciones,
			String trabajosFuturos, String trabajosRealizados,
			String fechaPresentacion, String palabrasClaves) {
		Tesina tesina = new Tesina();
		tesina.setTitulo(titulo);
		tesina.setAutor(autor);
		tesina.setDirector(director);
		tesina.setResumen(resumen);
		tesina.setConcluciones(concluciones);
		tesina.setTrabajosRealizados(trabajosRealizados);
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date fecha = null;
		try {
			fecha = sdf.parse(fechaPresentacion);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		tesina.setFechaPresentacion(fecha);
		
		tesina.setCarrera(carrera);
		tesina.setTrabajosFuturos(trabajosFuturos);
		
	
		return tesina;
	}

	@Override
	public void guardar(Tesina tesina) {
		try {
			EntityManager em = TesinaDAOhiberjpa.emf.createEntityManager();
			EntityTransaction etx = em.getTransaction();
			etx.begin();
			em.persist(tesina);
			em.flush();
			etx.commit();
			em.close();
		} catch (Exception e) {
			e.getMessage();
		}
		
	}

}
